/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tarea2.managedbeans;

import entidades.Medico;
import entidades.Mensaje;
import entidades.Mensaje.Tipo;
import entidades.Paciente;
import entidades.Usuario;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author Samuel Lehotský <lehotsky at atlas dot sk>
 */
@Named(value = "mensajesMBean")
@RequestScoped
public class MensajesMBean implements Serializable {

    private Usuario emisor;
    private String dni;
    private Tipo messageType;
    private String texto;
    private Random random = new Random(); //will be deleted later
    @Inject
    private UsuarioMBean usuarioBean;
    @Inject
    private LoginMBean loginBean;

    /**
     * Creates a new instance of MensajesMBean
     */
    public MensajesMBean() {
    }

    @PostConstruct
    public void init() {
        messageType = Tipo.mensaje;
        emisor = usuarioBean.getUsuario();
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public Tipo getMessageType() {
        return messageType;
    }

    public void setMessageType(Tipo messageType) {
        this.messageType = messageType;
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }

    public List<Tipo> getAllMessageTypes() {
        List<Tipo> ret = new LinkedList<>();
        for (Tipo t : Mensaje.Tipo.values()) {
            //solo pacientes se pueden quejar
            if (t == Tipo.queja && !(emisor instanceof Paciente)) {
                continue;
            }
            //solo doctores pueden crear alertas
            if (t == Tipo.alerta && !(emisor instanceof Medico)) {
                continue;
            }
            ret.add(t);
        }
        return ret;
    }

    public List<Usuario> getPossibleRecipients() {
        //TODO Temporary until Tarea 3
        List<Usuario> ret = new LinkedList<>();
        if (usuarioBean.isPaciente(emisor)) {
            ret.addAll(loginBean.getMedicos());
            ret.addAll(loginBean.getAdministrativos());
        }
        if (usuarioBean.isMedico(emisor)) {
            ret.addAll(loginBean.getPacientes());
            ret.addAll(loginBean.getAdministrativos());
        }
        if (usuarioBean.isAdministrativo(emisor)) {
            ret.addAll(loginBean.getPacientes());
            ret.addAll(loginBean.getMedicos());
            ret.addAll(loginBean.getAdministrativos());
            ret.addAll(loginBean.getAdministradores());
        }
        if (usuarioBean.isAdministrador(emisor)) {
            ret.addAll(loginBean.getPacientes());
            ret.addAll(loginBean.getMedicos());
        }

        return ret;
    }

    public Usuario getEmisor() {
        return emisor;
    }

    public void setEmisor(Usuario emisor) {
        this.emisor = emisor;
    }

    public UsuarioMBean getUsuarioBean() {
        return usuarioBean;
    }

    public void setUsuarioBean(UsuarioMBean usuarioBean) {
        this.usuarioBean = usuarioBean;
    }

    public String sendMessage() {
        //TODO fake until Tarea 3
        //first find the usuario with DNI
        Usuario recibe = null;
        for (Usuario u : loginBean.getPacientes()) {
            if (u.getDni().equals(dni)) {
                recibe = u;
                break;
            }
        }
        if (recibe == null) {
            for (Usuario u : loginBean.getMedicos()) {
                if (u.getDni().equals(dni)) {
                    recibe = u;
                    break;
                }
            }
        }
        if (recibe == null) {
            for (Usuario u : loginBean.getAdministradores()) {
                if (u.getDni().equals(dni)) {
                    recibe = u;
                    break;
                }
            }
        }
        if (recibe == null) {
            for (Usuario u : loginBean.getAdministrativos()) {
                if (u.getDni().equals(dni)) {
                    recibe = u;
                    break;
                }
            }
        }

        if (messageType == Tipo.queja) {
            recibe = null;
        }

        //then create message and update DB
        Mensaje newMensaje = new Mensaje(random.nextLong(), messageType, texto, emisor, recibe);
        emisor.getEnviados().add(newMensaje);
        if (recibe != null) {
            recibe.getRecibidos().add(newMensaje);
        }

        return usuarioBean.mensajesEnviados();
    }

    public String deleteRecibido(Long id) {
        //will change in Tarea 3
        for (Mensaje m : usuarioBean.getUsuario().getRecibidos()) {
            if (m.getId_Mensaje().equals(id)) {
                usuarioBean.getUsuario().getRecibidos().remove(m);
                break;
            }
        }
        return usuarioBean.mensajesRecibidos();
    }

    public String deleteEnviado(Long id) {
        //will change in Tarea 3
        for (Mensaje m : usuarioBean.getUsuario().getEnviados()) {
            if (m.getId_Mensaje().equals(id)) {
                usuarioBean.getUsuario().getEnviados().remove(m);
                break;
            }
        }
        return usuarioBean.mensajesEnviados();
    }

    public String deleteQueja(Long id) {
        //Ahora no posible - will change in Tarea 3
        return usuarioBean.mensajesQuejas();
    }

    public List<Mensaje> getQuejas() {
        //TODO: fake until tarea 3
        ArrayList ret = new ArrayList<>();
        ret.add(new Mensaje(5L, Mensaje.Tipo.queja, "El doctor es terible, no le quiero", emisor, null));
        return ret;
    }
}
